#include "mysql_utils.h"

sql_utils::sql_utils(const std::string & date_base,
                     const std::string & host,
                     const int port,
                     const std::string & user,
                     const std::string & passwd) {
    connection_flag = connect_mysql(host, port, user, passwd, date_base);
}

sql_utils::~sql_utils() {
    free_connect();
}

bool sql_utils::connect_mysql(const std::string & host,
                              const int port,
                              const std::string & user,
                              const std::string & passwd,
                              const std::string & date_base) {
    mysql_sock = mysql_init(NULL);
    if(mysql_sock == NULL){
        if(debug) fprintf(stderr, "fail init");
    }
    //初始化mysql
    if (!mysql_options(mysql_sock, MYSQL_SET_CHARSET_NAME, "UTF8")){

    }
    // 配置utf8编码, 防止乱码
    mysql_sock = mysql_real_connect(mysql_sock,
                                    host.c_str(),//主机
                                    user.c_str(),//用户名
                                    passwd.c_str(),//密码
                                    date_base.c_str(),//数据库名 必须是已经存在的 我的mysql大小写不敏感
                                    port,//端口号 默认的0或者3306
                                    NULL, 0//最后两个参数的常用写法 几乎都是这两个
    );
    if (!mysql_sock) {
        if(debug) fprintf(stderr, "Connected Fail\n");
        return false;
    } else {
        if(debug) fprintf(stderr, "Connected Success\n");
        return true;
    }
}

void sql_utils::free_connect() {
    if(mysql_sock != NULL) mysql_close(mysql_sock);
    if(debug) fprintf(stderr, "Connection Free...\n");
}

bool sql_utils::is_connection() const {
    return connection_flag;
}

std::vector<std::vector<std::string> > sql_utils::select(const std::string &sql) {
    using std::vector;
    using std::string;
    vector<vector<string> > result;

    if (!connection_flag) return result;
    if (mysql_real_query(mysql_sock, sql.c_str(), sql.size())) return result;
    MYSQL_RES *res = mysql_store_result(mysql_sock);

    if (!res) {
        fprintf(stderr, "Couldn't get result from : %s\n", mysql_error(mysql_sock));
        return result;
    }

    unsigned int num = mysql_num_fields(res);//获取列数

    MYSQL_ROW row;

    while ((row = mysql_fetch_row(res))) {//获取一行数据
        vector<string> row_data(num);
        for (int i = 0; i < num; ++i) row_data[i] = string(row[i]);
        result.push_back(row_data);
    }

    mysql_free_result(res);
    // 释放结果集

    return result;
}

bool sql_utils::query(const std::string &sql) {
    if (!connection_flag) return false;
    if(!mysql_real_query(mysql_sock, sql.c_str(), sql.size())){
        if(debug) fprintf(stderr, "query success\n");
        return true;
    }else{
        if(debug) fprintf(stderr, "query success\n");
        return false;
    }
}
